package org.dromara.system.service;

import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.bo.SysUserFriendBo;
import org.dromara.system.domain.vo.SysUserApplyVo;
import org.dromara.system.domain.vo.SysUserFriendCheckVo;
import org.dromara.system.domain.vo.SysUserFriendVo;
import org.dromara.system.domain.vo.SysUserVo;

import java.util.Collection;
import java.util.List;

/**
 * 用户好友信息Service接口
 *
 * @author Lion Li
 * @date 2025-02-24
 */
public interface ISysUserFriendService {

    /**
     * 查询用户好友信息
     *
     * @param id 主键
     * @return 用户好友信息
     */
    SysUserFriendVo queryById(Long id);

    /**
     * 分页查询用户好友信息列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 用户好友信息分页列表
     */
    TableDataInfo<SysUserFriendVo> queryPageList(SysUserFriendBo bo, PageQuery pageQuery);

    /**
     * 查询符合条件的用户好友信息列表
     *
     * @param bo 查询条件
     * @return 用户好友信息列表
     */
    List<SysUserFriendVo> queryList(SysUserFriendBo bo);

    /**
     * 新增用户好友信息
     *
     * @param bo 用户好友信息
     * @return 是否新增成功
     */
    Boolean insertByBo(SysUserFriendBo bo);

    /**
     * 修改用户好友信息
     *
     * @param bo 用户好友信息
     * @return 是否修改成功
     */
    Boolean updateByBo(SysUserFriendBo bo);

    /**
     * 校验并删除用户好友信息
     *
     * @param id      待删除的主键
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    int deleteWithValidById(Long id, boolean b);

    /**
     * 校验并批量删除用户好友信息信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 批量检查是否是好友
     *
     * @param userIds 用户id
     * @return SysUserFriendCheckVo
     */
    SysUserFriendCheckVo check(List<Long> userIds);

    /**
     * 申请好友
     *
     * @param msg 申请信息
     * @param uid 用户id
     * @return 申请结果
     */
    SysUserApplyVo apply(String msg, Long uid);

    /**
     * 申请列表
     *
     * @param pageQuery 分页参数
     * @return 申请列表
     */
    TableDataInfo<SysUserApplyVo> appplyList(PageQuery pageQuery);

    /**
     * 申请未读数量
     *
     * @return 申请未读数量
     */
    Long applyUnread();

    /**
     * 同意好友申请
     *
     * @param id 申请id
     * @return 是否同意成功
     */
    void agree(Long id);

    /**
     * 拒绝好友申请
     *
     * @param id 申请id
     * @return 是否拒绝成功
     */
    int reject(Long id);

    /**
     * 删除好友申请
     *
     * @param id 申请id
     * @return 是否删除成功
     */
    int deleteApply(Long id);

    /**
     * 修改好友备注
     *
     * @param targetUid 用户id
     * @param remark    备注
     * @return 是否修改成功
     */
    int updateRemark(Long targetUid, String remark);

    /**
     * 忽略审批
     *
     * @param id 申请id
     * @return 是否忽略成功
     */
    int ignore(Long id);

    /**
     * 查找联系人
     *
     * @param phoneNumber 电话
     * @param nickname    昵称
     * @return 联系人列表
     */
    List<SysUserVo> findContacts(String phoneNumber, String nickname);

    /**
     * 好友权限设置
     *
     * @param bo 好友权限设置
     * @return 是否修改成功
     */
    int updatePermission(SysUserFriendBo bo);
}
